/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gui;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
import neuronio.ClasseNeuronio;
import neuronio.Neuronio;
import rede.Rede;

/**
 *
 * @author Julio Dantas
 */
public class CanvasSOM extends JPanel{
  Rede rede;
  int tamanhoGridX, tamanhoGridY;
  boolean[] desenhaClasses;
  Color corGrid;
  ClasseNeuronio[] resposta = null;
  
  public CanvasSOM()
  {
    super();
    corGrid = Color.WHITE;
  }
  
  public CanvasSOM(Rede rede)
  {
    super();
    this.rede = rede;
    corGrid = Color.WHITE;
  }

  public void setRede(Rede rede)
  {
    this.rede = rede;
    calculaGrid(rede);
  }

  public void setResposta(ClasseNeuronio[] resposta)
  {
    this.resposta = resposta;
  }

  public void inicializaFlags(int tamanho)
  {
    this.desenhaClasses = new boolean[tamanho];
    for (int i = 0; i < desenhaClasses.length; i++)
    {
      desenhaClasses[i] = true;
    }
  }

  public void setDesenhaClasses(boolean desenha, int classe)
  {
    desenhaClasses[classe] = desenha;
  }
  
  public boolean getDesenhaClasses(int classe)
  {
    return(desenhaClasses[classe]);
  }

    private void calculaGrid(Rede rede) {
        if(rede != null){
            tamanhoGridX = this.getHeight() / rede.getNeuronios().length;
            tamanhoGridY = this.getWidth() / rede.getNeuronios()[0].length;
        }
    }
  
  private void desenhaGrid(Graphics g)
  {
    Neuronio[][] neuronios = rede.getNeuronios();
    int i;
    
    for (i = 1; i <= neuronios.length; i++)
    {
      g.drawLine(0, i * tamanhoGridX, this.getWidth(), i * tamanhoGridX);
    }
    for (i = 1; i <= neuronios[0].length; i++)
    {
      g.drawLine(i * tamanhoGridY, 0, i * tamanhoGridY, this.getHeight());
    }
  }

  public void setCorGrid(Color corGrid)
  {
    this.corGrid = corGrid;
  }
  
  @Override
  public void paint(Graphics g)
  {
    super.paint(g);
    calculaGrid(rede);
    if (rede != null)
    {
      int tamanhoDesenhoX, tamanhoDesenhoY;
      int posicaoX, posicaoY;
      String temp = new String();
      //Graphics2D temp = (Graphics2D)g;
      
      g.setColor(corGrid);
      desenhaGrid(g);
      //g.setColor(Color.BLUE);
      
      /*g.drawString("local0 0", (0 * tamanhoGridX) + 1, (0 * tamanhoGridY) + 10);
      g.drawString("local0 1", 0 * tamanhoGridX, tamanhoGridY + 10);
      g.drawString("local0 2", 0 * tamanhoGridX, 2 * tamanhoGridY);*/
      
      if (resposta != null)
      {
        tamanhoDesenhoX = (tamanhoGridX / 2);
        tamanhoDesenhoY = (tamanhoGridX / 2);
        
        //g.drawString("local0 0", tamanhoDesenhoX, tamanhoDesenhoY);
        
        
        for (int i = 0; i < resposta.length; i++)
        {
          ClasseNeuronio classeNeuronio = resposta[i];
          if (desenhaClasses[classeNeuronio.getClasseCodificada()])
          {
            g.setColor(classeNeuronio.getCor());
            //g.drawString(classeNeuronio.getClasseOriginal(), 10 + (tamanhoGridY * classeNeuronio.getY()), 10 + (tamanhoGridX * classeNeuronio.getX()));
            temp = "Classe " + String.valueOf(classeNeuronio.getClasseCodificada());
            posicaoX = (tamanhoDesenhoX * (1 + classeNeuronio.getX())) + tamanhoDesenhoX * classeNeuronio.getX();
            posicaoY = (tamanhoDesenhoY * (1 + classeNeuronio.getY())) + tamanhoDesenhoY * classeNeuronio.getY();
            
            
            g.drawString(temp, posicaoX, posicaoY);
          }
        }
        
      }
      
      //temp.
      
    }
  }
  
}
